const BaseProjectController = require('./base_project_controller.js');
const ProjectModel = require('../config/models_config').project_model;
const timeUtil = require('../../../framework/helpers/time_util.js');
const appCode = require('../../../framework/core/app_code.js');
const config = require('../../../config/config.js');
const ProjectService = require('../service/project_service.js');
const AppError = require('../../../framework/core/app_error.js');

class ProjectController extends BaseProjectController {
	constructor(route, openId, event) {
		super(route, openId, event);
	}

	/** 创建服务实例 */
	_getService() {
		const service = new ProjectService();
		// 设置用户ID
		service._userId = this._userId;
		return service;
	}

	/** 获取项目列表 */
	async getProjectList() {
		// 初始化数据库
		await this.initSetup();

		// 数据校验
		let rules = {
			search: 'string|min:0|max:30|name=搜索条件',
			sortType: 'string|name=搜索类型',
			sortVal: 'name=搜索类型值',
			page: 'must|int|default=1',
			size: 'must|int',
			status: 'string|name=状态',
		};

		// 取得数据
		let input = this.validateData(rules);
		console.log('[getProjectList] 输入参数:', input);

		let result = await ProjectModel.getProjectList(input);
		console.log('[getProjectList] 查询结果:', result);

		// 不在这里格式化日期，让前端处理
		return result;
	}

	/** 获取项目详情 */
	async getProjectDetail() {
		// 数据校验
		let rules = {
			id: 'must|id',
		};

		// 取得数据
		let input = this.validateData(rules);
		let detail = await ProjectModel.getProjectDetail(input.id);
		if (detail) {
			detail.startDate = timeUtil.timestamp2Time(detail.startDate, 'Y-M-D');
			detail.deadline = timeUtil.timestamp2Time(detail.deadline, 'Y-M-D');
			detail.createTime = timeUtil.timestamp2Time(detail.createTime);
		}

		return detail;
	}

	/** 创建项目 */
	async createProject() {
		// 初始化数据库
		await this.initSetup();
		
		// 数据校验
		let rules = {
			model: 'must|string|min:2|max:50|name=型号',
			leader: 'must|string|min:2|max:20|name=项目负责人',
			department: 'must|string|min:2|max:20|name=所属部门',
			startDate: 'must|int|name=开始日期',  // 改回为int类型
			deadline: 'must|int|name=截止日期',   // 改回为int类型
			priority: 'must|string|in:low,normal,high,urgent|name=优先级',
			status: 'must|string|in:planning,ongoing,completed,suspended|name=状态',
			description: 'string|max:500|name=项目描述',
			applicationType: 'string|max:50|name=应用类型',
			workTemp: 'string|max:50|name=工作环境温度',
			certification: 'string|max:100|name=认证要求',
			lowPower: 'string|max:50|name=低功耗要求',
			startupTime: 'string|max:50|name=启动时间要求',
			conformalCoating: 'string|max:10|name=三防漆要求',
			ratedVoltage: 'string|max:50|name=额定电压',
			maxPower: 'string|max:50|name=最大功率',
			maxSpeed: 'string|max:50|name=最高转速'
		};

		// 取得数据
		let input = this.validateData(rules);
		console.log('[createProject] 验证后的数据：', input);
		
		// 如果存在name字段，删除它
		if (input.name) {
			console.log('[createProject] 删除name字段，使用model作为标识');
			delete input.name;
		}
		
		// 检查是否有潜在的脏数据
		console.log('[createProject] 检查潜在脏数据：', Object.keys(input));
		for (let key in input) {
			if (!ProjectModel.DB_STRUCTURE.hasOwnProperty(key)) {
				console.warn('[createProject] 潜在脏数据字段：', key);
			}
		}
		
		// 数据获取
		try {
			// 日期处理 - 这里只需要确保类型是整数即可，前端已经转换为时间戳
			if (input.startDate) {
				console.log('[createProject] 处理开始日期：', input.startDate);
				// 如果是字符串且不是数字字符串，才需要转换
				if (typeof input.startDate === 'string' && isNaN(input.startDate)) {
					try {
						input.startDate = timeUtil.time2Timestamp(input.startDate);
					} catch (e) {
						console.error('[createProject] 开始日期转换错误：', e);
						throw new AppError('开始日期格式错误，请使用YYYY-MM-DD格式');
					}
				}
				// 确保是整数
				input.startDate = parseInt(input.startDate);
				console.log('[createProject] 处理后开始日期时间戳：', input.startDate);
			}

			if (input.deadline) {
				console.log('[createProject] 处理截止日期：', input.deadline);
				// 如果是字符串且不是数字字符串，才需要转换
				if (typeof input.deadline === 'string' && isNaN(input.deadline)) {
					try {
						input.deadline = timeUtil.time2Timestamp(input.deadline);
					} catch (e) {
						console.error('[createProject] 截止日期转换错误：', e);
						throw new AppError('截止日期格式错误，请使用YYYY-MM-DD格式');
					}
				}
				// 确保是整数
				input.deadline = parseInt(input.deadline);
				console.log('[createProject] 处理后截止日期时间戳：', input.deadline);
			}

			// 创建一个只包含DB_STRUCTURE中定义的字段的新对象
			const cleanInput = {};
			for (let key in input) {
				if (ProjectModel.DB_STRUCTURE.hasOwnProperty(key)) {
					cleanInput[key] = input[key];
				}
			}
			
			console.log('[createProject] 清理后的数据：', cleanInput);

			// 使用辅助方法创建服务实例
			const projectService = this._getService();

			// 插入数据 - 使用createProject而不是insertProject
			const id = await projectService.createProject(cleanInput);
			if (id) {
				console.log('[createProject] 创建成功，项目ID：', id);
				return {
					_id: id,  // 修改返回格式，使用_id而不是id
					success: true
				};
			} else {
				console.error('[createProject] 创建失败，没有返回ID');
				throw new AppError('创建失败，请重试');
			}
		} catch (err) {
			console.error('[createProject] 错误：', err);
			throw err; // 直接抛出错误，让框架处理
		}
	}

	/** 更新项目 */
	async updateProject() {
		// 初始化数据库
		await this.initSetup();
		
		// 数据校验
		let rules = {
			id: 'must|id|name=项目ID',
			name: 'string|min:2|max:50|name=项目名称',
			leader: 'string|min:2|max:20|name=项目负责人',
			department: 'string|min:2|max:20|name=所属部门',
			startDate: 'int|name=开始日期',  // 改回为int类型
			deadline: 'int|name=截止日期',   // 改回为int类型
			priority: 'string|in:low,normal,high,urgent|name=优先级',
			status: 'string|in:planning,ongoing,completed,suspended|name=状态',
			description: 'string|max:500|name=项目描述',
			applicationType: 'string|max:50|name=应用类型',
			workTemp: 'string|max:50|name=工作环境温度',
			certification: 'string|max:100|name=认证要求',
			lowPower: 'string|max:50|name=低功耗要求',
			startupTime: 'string|max:50|name=启动时间要求',
			conformalCoating: 'string|max:10|name=三防漆要求',
			ratedVoltage: 'string|max:50|name=额定电压',
			maxPower: 'string|max:50|name=最大功率',
			maxSpeed: 'string|max:50|name=最高转速'
		};

		// 取得数据
		let input = this.validateData(rules);
		console.log('[updateProject] 验证后的数据：', input);
		
		try {
			// 日期处理
			if (input.startDate) {
				console.log('[updateProject] 处理开始日期：', input.startDate);
				// 如果是字符串且不是数字字符串，才需要转换
				if (typeof input.startDate === 'string' && isNaN(input.startDate)) {
					try {
						input.startDate = timeUtil.time2Timestamp(input.startDate);
					} catch (e) {
						console.error('[updateProject] 开始日期转换错误：', e);
						throw new AppError('开始日期格式错误，请使用YYYY-MM-DD格式');
					}
				}
				// 确保是整数
				input.startDate = parseInt(input.startDate);
				console.log('[updateProject] 处理后开始日期时间戳：', input.startDate);
			}

			if (input.deadline) {
				console.log('[updateProject] 处理截止日期：', input.deadline);
				// 如果是字符串且不是数字字符串，才需要转换
				if (typeof input.deadline === 'string' && isNaN(input.deadline)) {
					try {
						input.deadline = timeUtil.time2Timestamp(input.deadline);
					} catch (e) {
						console.error('[updateProject] 截止日期转换错误：', e);
						throw new AppError('截止日期格式错误，请使用YYYY-MM-DD格式');
					}
				}
				// 确保是整数
				input.deadline = parseInt(input.deadline);
				console.log('[updateProject] 处理后截止日期时间戳：', input.deadline);
			}

			let projectId = input.id;
			delete input.id; // 不更新ID字段

			console.log('[updateProject] 正在更新项目，ID:', projectId, '数据:', input);

			// 使用辅助方法创建服务实例
			const projectService = this._getService();

			// 更新数据
			let result = await projectService.updateProject(projectId, input);
			if (result) {
				console.log('[updateProject] 更新成功');
				return {
					result: true
				};
			} else {
				console.error('[updateProject] 更新失败');
				throw new AppError('更新失败，请重试');
			}
		} catch (err) {
			console.error('[updateProject] 错误：', err);
			throw err; // 直接抛出错误，让框架处理
		}
	}

	/** 删除项目 */
	async deleteProject() {
		// 初始化数据库
		await this.initSetup();
		
		// 数据校验
		let rules = {
			id: 'must|id|name=项目ID',
		};

		// 取得数据
		let input = this.validateData(rules);
		
		try {
			console.log('[deleteProject] 正在删除项目，ID:', input.id);
			let result = await ProjectModel.deleteProject(input.id);
			if (result) {
				console.log('[deleteProject] 删除成功');
				return {
					result: true
				};
			} else {
				console.error('[deleteProject] 删除失败');
				throw new AppError('删除失败，请重试');
			}
		} catch (err) {
			console.error('[deleteProject] 错误：', err);
			throw err; // 直接抛出错误，让框架处理
		}
	}
}

module.exports = ProjectController; 